home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-09-28 | 14.8 KB | 589 lines | [TEXT/CWIE] |
- /*
- File: MoreNetworkSetup.c
-
- Contains: Simple wrappers to make Network Setup easier.
-
- Written by: Quinn
-
- Copyright: Copyright © 1998 by Apple Computer, Inc., all rights reserved.
-
- You may incorporate this Apple sample source code into your program(s) without
- restriction. This Apple sample source code has been provided "AS IS" and the
- responsibility for its operation is yours. You are not permitted to redistribute
- this Apple sample source code as "Apple sample source code" after having made
- changes. If you're going to re-distribute the source, we require that you make
- it clear in the source that the code was descended from Apple sample source
- code, but that you've made changes.
-
- Change History (most recent first):
-
- <12> 17/1/00 Quinn Updates for latest Network Setup headers.
- <11> 19/10/99 Quinn Fix embarrassing spelling error.
- <10> 16/9/99 Quinn MNGetPrefHandle was always returning an error. Thanks to Thomas
- Weisbach.
- <9> 31/8/99 AndyB MNSGetEntitiesList could lose MemError when allocating paramInfos.
- <8> 21/4/99 Quinn Added MNSGetPrefHandle, MNSSetPrefHandle and MNSIterateEntity,
- along with some general tidy up.
- <7> 30/3/99 Quinn Fixed type check error when calling DisposePtr.
- <6> 10/11/98 Quinn Fix bug in MNSIterateSet where it incremented the loop counter
- twice each iteration. Whoops.
- <5> 10/11/98 Quinn Convert "MorePrefix.h" to "MoreSetup.h".
- <4> 5/11/98 Quinn Use MoreAssertQ instead of MoreAssert.
- <3> 5/11/98 Quinn Fix header again.
- <2> 5/11/98 Quinn Fix header.
- <1> 5/11/98 Quinn First checked in.
- */
-
- /////////////////////////////////////////////////////////////////
- // MoreIsBetter Setup
-
- #include "MoreSetup.h"
-
- /////////////////////////////////////////////////////////////////
- // Mac OS Interfaces
-
- #include <Types.h>
- #include <Files.h>
- #include <Errors.h>
- #include <Folders.h>
- #include <Resources.h>
- #include <Gestalt.h>
- #include <CodeFragments.h>
- #include <NetworkSetup.h>
-
- /////////////////////////////////////////////////////////////////
- // Our Prototypes
-
- #include "MoreNetworkSetup.h"
-
- /////////////////////////////////////////////////////////////////
-
- #if TARGET_RT_MAC_CFM
-
- extern pascal Boolean IsNetworkSetupAvailable()
- // See comment in interface part.
- {
- return (void *) OTCfgOpenDatabase != (void *) kUnresolvedCFragSymbolAddress;
- }
-
- #else
-
- extern pascal Boolean IsNetworkSetupAvailable()
- // See comment in interface part.
- {
- OSStatus junk;
- Boolean result;
- UInt32 response;
- CFragConnectionID connID;
- Ptr junkMain;
- Str255 junkMessage;
-
- #if TARGET_RT_MAC_CFM
- #error "IsNetworkSetupAvailable: This routine should not be used by CFM code."
- #endif
-
- result = false;
-
- if ( Gestalt(gestaltCFMAttr, (SInt32 *) &response) == noErr && (response & (1 << gestaltCFMPresent)) != 0) {
- if ( GetSharedLibrary("\pCfgOpenTpt", kAnyCFragArch, kReferenceCFrag, &connID, &junkMain, junkMessage) == noErr ) {
- result = true;
- junk = CloseConnection(&connID);
- MoreAssertQ(junk == noErr);
- }
- }
-
- return result;
- }
-
- #endif
-
- extern pascal Boolean MNSValidDatabase(const MNSDatabaseRef *ref)
- // See comment in interface part.
- {
- return ref != nil && ref->dbRef != nil && ref->area != 0;
- }
-
- extern pascal Boolean MNSDatabaseWritable(const MNSDatabaseRef *ref)
- // See comment in interface part.
- {
- return (ref->originalArea != 0);
- }
-
- extern pascal OSStatus MNSOpenDatabase(MNSDatabaseRef *ref, Boolean forWriting)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus junk;
-
- MoreAssertQ(ref != nil);
-
- ref->dbRef = nil;
- ref->area = 0;
- ref->originalArea = 0;
-
- err = OTCfgOpenDatabase(&ref->dbRef);
- if (err == noErr) {
- err = OTCfgGetCurrentArea(ref->dbRef, &ref->area);
- if (err == noErr) {
- if (forWriting) {
- ref->originalArea = ref->area;
- err = OTCfgBeginAreaModifications(ref->dbRef, ref->originalArea, &ref->area);
- } else {
- err = OTCfgOpenArea(ref->dbRef, ref->area);
- }
- }
- if (err != noErr) {
- junk = MNSCloseDatabase(ref, false);
- MoreAssertQ(junk == noErr);
- }
- }
- return err;
- }
-
- extern pascal OSStatus MNSCloseDatabase(MNSDatabaseRef *ref, Boolean commit)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus err2;
-
- MoreAssertQ(ref != nil);
- MoreAssertQ(ref->dbRef != nil);
- MoreAssertQ(ref->originalArea == 0 || ref->area != 0);
-
- err = noErr;
- if (ref->area != 0) {
- if ( MNSDatabaseWritable(ref) ) {
- if ( commit ) {
- err = OTCfgCommitAreaModifications(ref->dbRef, ref->originalArea, ref->area);
- } else {
- err = OTCfgAbortAreaModifications(ref->dbRef, ref->originalArea);
- }
- } else {
- // Database was opened read-only, you're just not allowed to commit it.
- MoreAssertQ( ! commit );
- err = OTCfgCloseArea(ref->dbRef, ref->area);
- }
- }
- err2 = OTCfgCloseDatabase(&ref->dbRef);
- if (err == noErr) {
- err = err2;
- }
- ref->dbRef = nil;
- ref->area = 0;
- ref->originalArea = 0;
-
- return err;
- }
-
- extern pascal OSStatus MNSGetFixedSizePref(const MNSDatabaseRef *ref,
- const CfgEntityRef *entityID,
- OSType prefType,
- void *buffer, ByteCount prefSize)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus err2;
- CfgEntityAccessID prefsRefNum;
- ByteCount actualPrefSize;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ(entityID != nil);
- MoreAssertQ(buffer != nil);
-
- // Open the entity, read out the preference, and then
- // close it down.
-
- err = OTCfgOpenPrefs(ref->dbRef, entityID, false, &prefsRefNum);
- if (err == noErr) {
- err = OTCfgGetPrefsSize(prefsRefNum, prefType, &actualPrefSize);
- if (err == noErr && actualPrefSize != prefSize) {
- err = -1;
- }
- if (err == noErr) {
- err = OTCfgGetPrefs(prefsRefNum, prefType, buffer, prefSize);
- }
-
- err2 = OTCfgClosePrefs(prefsRefNum);
- if (err == noErr) {
- err = err2;
- }
- }
-
- return err;
- }
-
- extern pascal OSStatus MNSGetPref(const MNSDatabaseRef *ref,
- const CfgEntityRef *entityID,
- OSType prefType,
- void **buffer, ByteCount *prefSize)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus err2;
- CfgEntityAccessID prefsRefNum;
- ByteCount junkPrefSize;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ(entityID != nil);
- MoreAssertQ(buffer != nil);
- MoreAssertQ(*buffer == nil);
-
- if (prefSize == nil) {
- prefSize = &junkPrefSize;
- }
-
- // Open the entity, read out the preference, and then
- // close it down.
-
- *buffer = nil;
- err = OTCfgOpenPrefs(ref->dbRef, entityID, false, &prefsRefNum);
- if (err == noErr) {
- err = OTCfgGetPrefsSize(prefsRefNum, prefType, prefSize);
-
- if (err == noErr) {
- *buffer = NewPtr(*prefSize);
- if (*buffer == nil) {
- MoreAssertQ(err == memFullErr);
- err = memFullErr;
- }
- }
- if (err == noErr) {
- err = OTCfgGetPrefs(prefsRefNum, prefType, *buffer, *prefSize);
- }
-
- err2 = OTCfgClosePrefs(prefsRefNum);
- if (err == noErr) {
- err = err2;
- }
- }
-
- // Clean up.
-
- if (err != noErr && *buffer != nil) {
- DisposePtr( (Ptr) *buffer);
- MoreAssertQ(MemError() == noErr);
- *buffer = nil;
- }
- return err;
- }
-
- extern pascal OSStatus MNSSetPref(const MNSDatabaseRef *ref,
- const CfgEntityRef *entityID,
- OSType prefType,
- const void *prefData, ByteCount prefSize)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus err2;
- CfgEntityAccessID prefsRefNum;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ(MNSDatabaseWritable(ref));
- MoreAssertQ(entityID != nil);
- MoreAssertQ(prefData != nil);
- MoreAssertQ(prefSize != nil);
-
- err = OTCfgOpenPrefs(ref->dbRef, entityID, true, &prefsRefNum);
- if (err == noErr) {
- err = OTCfgSetPrefs(prefsRefNum, prefType, prefData, prefSize);
-
- err2 = OTCfgClosePrefs(prefsRefNum);
- if (err == noErr) {
- err = err2;
- }
- }
-
- return err;
- }
-
- extern pascal OSStatus MNSGetPrefHandle(const MNSDatabaseRef *ref,
- const CfgEntityRef *entityID,
- OSType prefType,
- Handle prefData)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus err2;
- CfgEntityAccessID prefsRefNum;
- ByteCount prefSize;
- SInt8 s;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ(entityID != nil);
- MoreAssertQ(prefData != nil);
-
- // Open the entity, read out the preference, and then
- // close it down.
-
- err = OTCfgOpenPrefs(ref->dbRef, entityID, false, &prefsRefNum);
- if (err == noErr) {
- err = OTCfgGetPrefsSize(prefsRefNum, prefType, &prefSize);
- if (err == noErr) {
- SetHandleSize(prefData, prefSize);
- err = MemError();
- }
- if (err == noErr) {
- s = HGetState(prefData);
- HLock(prefData);
- err = OTCfgGetPrefs(prefsRefNum, prefType, *prefData, prefSize);
- HSetState(prefData, s);
- }
-
- err2 = OTCfgClosePrefs(prefsRefNum);
- if (err == noErr) {
- err = err2;
- }
- }
-
- return err;
- }
-
- extern pascal OSStatus MNSSetPrefHandle(const MNSDatabaseRef *ref,
- const CfgEntityRef *entityID,
- OSType prefType,
- Handle prefData)
- // See comment in interface part.
- {
- OSStatus err;
- SInt8 s;
-
- s = HGetState(prefData);
- MoreAssertQ(MemError() == noErr);
- HLock(prefData);
- MoreAssertQ(MemError() == noErr);
-
- err = MNSSetPref(ref, entityID, prefType, *prefData, GetHandleSize(prefData));
-
- HSetState(prefData, s);
- MoreAssertQ(MemError() == noErr);
-
- return err;
- }
-
- extern pascal OSStatus MNSIterateEntity(const MNSDatabaseRef *ref,
- const CfgEntityRef *entity,
- MNSPrefIterator iteratorProc,
- void *refcon)
- // See comment in interface part.
- {
- OSStatus err;
- OSStatus err2;
- CfgEntityAccessID prefsRefNum;
- ItemCount prefsTOCCount;
- CfgPrefsHeader *prefsTOCs;
- ItemCount prefsTOCIndex;
- OSType prefType;
- Handle prefDataH;
- ByteCount prefSize;
-
- prefsTOCs = nil;
- prefDataH = nil;
-
- prefDataH = NewHandle(0);
- err = MemError();
- if (err == noErr) {
- err = OTCfgOpenPrefs(ref->dbRef, entity, false, &prefsRefNum);
- if (err == noErr) {
- err = OTCfgGetPrefsTOCCount(prefsRefNum, &prefsTOCCount);
- if (err == noErr) {
- prefsTOCs = (CfgPrefsHeader *) NewPtr( prefsTOCCount * sizeof(CfgPrefsHeader));
- err = MemError();
- }
- if (err == noErr) {
- err = OTCfgGetPrefsTOC(prefsRefNum, &prefsTOCCount, prefsTOCs);
- }
- if (err == noErr) {
- for (prefsTOCIndex = 0; prefsTOCIndex < prefsTOCCount; prefsTOCIndex++) {
- prefType = prefsTOCs[prefsTOCIndex].fType;
- prefSize = prefsTOCs[prefsTOCIndex].fSize;
- HUnlock(prefDataH);
- MoreAssertQ(MemError() == noErr);
-
- SetHandleSize(prefDataH, prefSize);
- err = MemError();
- if (err == noErr) {
- HLock(prefDataH);
- MoreAssertQ(MemError() == noErr);
-
- err = OTCfgGetPrefs(prefsRefNum, prefType, *prefDataH, prefSize);
- }
- if (err == noErr) {
- iteratorProc(prefType, *prefDataH, prefSize, refcon);
- }
- if (err != noErr) {
- break;
- }
- }
- }
-
- err2 = OTCfgClosePrefs(prefsRefNum);
- if (err == noErr) {
- err = err2;
- }
- }
- }
-
- if (prefsTOCs != nil) {
- DisposePtr( (Ptr) prefsTOCs);
- MoreAssertQ(MemError() == noErr);
- }
- if (prefDataH != nil) {
- DisposeHandle(prefDataH);
- MoreAssertQ(MemError() == noErr);
- }
-
- return err;
- }
-
-
- extern pascal OSStatus MNSGetEntitiesList(const MNSDatabaseRef *ref,
- OSType entityClass, OSType entityType,
- ItemCount *entityCount,
- CfgEntityRef **entityIDs,
- CfgEntityInfo **entityInfos)
- // See comment in interface part.
- {
- OSStatus err;
- CfgEntityRef *paramIDs;
- CfgEntityInfo *paramInfos;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ(entityCount != nil);
- MoreAssertQ(entityIDs == nil || *entityIDs == nil );
- MoreAssertQ(entityInfos == nil || *entityInfos == nil);
-
- err = OTCfgGetEntitiesCount(ref->dbRef, ref->area, entityClass, entityType, entityCount);
- if (err == noErr) {
- if (entityIDs == nil) {
- paramIDs = nil;
- } else {
- *entityIDs = (CfgEntityRef *) NewPtr(*entityCount * sizeof(CfgEntityRef));
- if (*entityIDs == nil) {
- MoreAssertQ(err == memFullErr);
- err = memFullErr;
- }
- paramIDs = *entityIDs;
- }
- }
- if (err == noErr) {
- if (entityInfos == nil) {
- paramInfos = nil;
- } else {
- *entityInfos = (CfgEntityInfo *) NewPtr(*entityCount * sizeof(CfgEntityInfo));
- if (*entityInfos == nil) {
- MoreAssertQ(err == memFullErr);
- err = memFullErr;
- }
- paramInfos = *entityInfos;
- }
- }
- if (err == noErr) {
- err = OTCfgGetEntitiesList(ref->dbRef, ref->area,
- entityClass, entityType,
- entityCount, paramIDs, paramInfos);
- }
-
- // Clean up.
-
- if (err != noErr) {
- if (*entityIDs != nil) {
- DisposePtr( (Ptr) *entityIDs);
- MoreAssertQ(MemError() == noErr);
- *entityIDs = nil;
- }
- if (*entityInfos != nil) {
- DisposePtr( (Ptr) *entityInfos);
- MoreAssertQ(MemError() == noErr);
- *entityInfos = nil;
- }
- }
-
- return err;
- }
-
- extern pascal OSStatus MNSFindActiveSet(const MNSDatabaseRef *ref, CfgEntityRef *activeSet)
- // See comment in interface part.
- {
- OSStatus err;
- ItemCount setCount;
- CfgEntityRef *setEntities;
- Boolean found;
- ItemCount thisSetIndex;
- CfgSetsStruct thisStruct;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ(activeSet != nil);
-
- setEntities = nil;
-
- err = MNSGetEntitiesList(ref, kOTCfgClassSetOfSettings, kOTCfgTypeSetOfSettings, &setCount, &setEntities, nil);
- if (err == noErr) {
- thisSetIndex = 0;
- found = false;
- while (err == noErr && thisSetIndex < setCount && ! found) {
- err = MNSGetFixedSizePref(ref, &setEntities[thisSetIndex], kOTCfgSetsStructPref,
- &thisStruct, sizeof(thisStruct));
- if (err == noErr) {
- found = ((thisStruct.fFlags & kOTCfgSetsFlagActiveMask) != 0);
- if ( ! found ) {
- thisSetIndex += 1;
- }
- }
- }
- if (err == noErr && ! found) {
- err = -2;
- }
- }
- if (err == noErr) {
- *activeSet = setEntities[thisSetIndex];
- }
-
- // Clean up.
-
- if (setEntities != nil) {
- DisposePtr( (Ptr) setEntities);
- MoreAssertQ(MemError() == noErr);
- }
-
- return err;
- }
-
- extern pascal OSStatus MNSIterateSet(const MNSDatabaseRef *ref,
- const CfgEntityRef *setEntity,
- MNSSetIterator iteratorProc,
- void *refcon,
- Boolean writeAfterIterate)
- // See comment in interface part.
- {
- OSStatus err;
- CfgSetsVector *vectorPrefData;
- ByteCount vectorPrefSize;
- ItemCount thisElementIndex;
-
- MoreAssertQ(MNSValidDatabase(ref));
- MoreAssertQ( !writeAfterIterate || MNSDatabaseWritable(ref) );
- MoreAssertQ(setEntity != nil);
- MoreAssertQ(iteratorProc != nil);
-
- vectorPrefData = nil;
-
- err = MNSGetPref(ref, setEntity, kOTCfgSetsVectorPref,
- &vectorPrefData, &vectorPrefSize);
- if (err == noErr) {
- for (thisElementIndex = 0; thisElementIndex < vectorPrefData->fCount; thisElementIndex++) {
- iteratorProc(ref, &vectorPrefData->fElements[thisElementIndex], refcon);
- }
- if (writeAfterIterate) {
- err = MNSSetPref(ref, setEntity, kOTCfgSetsVectorPref, vectorPrefData, vectorPrefSize);
- }
- }
-
- // Clean up.
-
- if (vectorPrefData != nil) {
- DisposePtr( (Ptr) vectorPrefData);
- MoreAssertQ(MemError() == noErr);
- }
- return err;
- }
-